#ifndef _LIBREAD_JSON_H_
#define _LIBREAD_JSON_H_

/*****************  错误码定义    *****************/
#define READJSON_SUCCESS                (0)    // 成功返回
#define E_READJSON_OPENFILE             (-1)   // 打开文件失败
#define E_READJSON_READFILE             (-2)   // 读取文件失败
#define E_READJSON_INPUTSTR             (-3)   // 输入非法字符串（不是json格式）
#define E_READJSON_NULLPOINTER          (-4)   // 空指针
#define E_READJSON_INSUFFICIENT_SPACE   (-5)   // 需要的空间不足
#define E_READJSON_DYNAMICARRAY_INIT    (-6)   // 动态数组初始化失败
#define E_READJSON_MALLOC               (-7)   // 申请空间失败

/*****************  参数大小限制(根据需要调整)    *****************/
#define JSON_NUMBER             10      // json数组中最大项数           [ {...}, {...}, {...} ] json项 = 3
#define JSON_MAX_SIZE           4096    // 单项json最大大小             siezof( {...} ) <= JSON_MAX_SIZE
#define PARAMETER_MAX_NUMBER    100     // 单项json中成员最多个数       { "a":1, "bb":2, "c":3 } 成员数=3
#define PARAMETER_MAX_LENGTH    8192    // 最大key或value占用的最大空间 sizeof( "bb" ) <= PARAMETER_MAX_LENGTH / 2

/************  存放解析好的 key:value 结构定义    ************/
typedef struct json_member_t {
    char key[PARAMETER_MAX_LENGTH / 8 * 1];
    char value[PARAMETER_MAX_LENGTH / 8 * 7];
}json_member_t;

// 用户使用的解析json函数
/**********************************************************************
 *  函数功能:   将json文件解析成键值对
 *  输入参数:
 *          input_json_file:    json文件存放路径；
 *          member_max_num:     json_member可操作的最大个数；
 *  输出参数:
 *          json_member:  存放解析完成的键值对的数组；
 *              例：第一个键值对存放于 json_member[0]
 *                  key为：     json_member[0].key
 *                  value为：   json_member[0].value
 *  返回值:
 *          成功返回解析成功的键值对数量；
 *          失败返回小于0的错误码；
 ***********************************************************************/
int jsonfile_to_keyvalue(json_member_t* json_member, unsigned int member_max_num, const char* input_json_file);

/**********************************************************************
 *  函数功能:   将json文件解析成键值对
 *  输入参数:
 *          input_json_str:     json字符串起始地址；
 *          str_len:            json字符串长度；
 *          member_max_num:     json_member可操作的最大个数；
 *  输出参数:
 *          json_member:  存放解析完成的键值对的数组；
 *              例：第一个键值对存放于 json_member[0]
 *                  key为：     json_member[0].key
 *                  value为：   json_member[0].value
 *  返回值:
 *          返回解析成功的键值对数量；
 *          失败返回小于0的错误码；
 ***********************************************************************/
int jsonbuf_to_keyvalue(json_member_t *json_member, unsigned int member_max_num, const char *input_json_str, unsigned int str_len);

/**********************************************************************
 *  函数功能:   read_json工具错误码释义
 *  输入参数:
 *          error_code: read_json工具中系列函数返回的错误码；
 *  输出参数:
 *          无；错误码的解释信息将由RJ_LOG_INFO()输出到终端；
 *  返回值:
 *          无；
 ***********************************************************************/
void readjson_error_code_interpret(int error_code);

/**********************************************************************
 *  函数功能:   打印解析出的json键值对
 *  输入参数:
 *          json_member:  存放解析完成的键值对的数组；
 *  输出参数:
 *          无；
 *  返回值:
 *          无；
 ***********************************************************************/
void readjson_print_json_member(json_member_t *json_member, unsigned int json_num);


#endif